/// 1. 闭包是可以保存进变量或者作为参数传递给其他函数的匿名函数
/// - 闭包和函数不同的是，闭包允许捕获调用者作用域中的值
/// 2. 闭包的使用方式
/// 3. 使用带泛型和Fn trait的闭包
fn main() {
    let use_closure = || {
        println!("这是use_closure")
    };
    use_closure();
    // 非闭包的调用
    let x = add_one_v1(5, 0);
    println!("5 + 0 = {}", x);
    // 闭包的语法格式，只能推导一次，不能推导两次
    // 写法1
    let add_one_v2 = |x: u32, y: u32| -> u32 { x + y };
    let add = add_one_v2(5, 1);
    println!("5 + 1 = {}", add);
    // 写法2
    let add_one_v3 = |x,y| {x + y};
    let add = add_one_v3(5, 2);
    println!("5 + 2 = {}", add);
    // 写法3
    let add_one_v4 = |x, y| x + y;
    let add = add_one_v4(5, 3);
    println!("5 + 3 = {}", add);

    // 捕捉环境中的变量
    let i = 1; // 环境中的变量
    let exe = |x| x + i;
    let r = exe(5);
    println!("r = {}", r);
}
// 这个是标准格式
fn add_one_v1(x: u32, y: u32) -> u32{
    x + y
}

